﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "NdbPropertySchema.h"
#include "NdbTypeTraits.h"
#include "ClassId.h"
#include <utility>
#include "GcmpModel.h"

namespace gcmp
{
    /// \brief schema 辅助工具函数类
    class GCMP_MODEL_EXPORT NdbClassSchemaUtils
    {
    public:
        /// \brief 比较文件中保存的ClassSchema和程序中类Schema管理器中ClassSchema的版本
        ///
        /// 导出信息包括ClassSchema的classId,模块名，版本及类名以及其父类的classId及类名，还有其属性信息（属性名称及类型）
        /// \param fileFullPath 文件全路径，不存在、或者不是可识别的模型文件，返回false
        /// \param[out] added 如果传入非空，将填写相比程序，文件中新增的ClassSchema的Id
        /// \param[out] deleted 如果传入非空，将填写相比程序，文件中删除的ClassSchema的Id
        /// \param[out] updated 如果传入非空，将填写相比程序，文件中版本变化的ClassSchema的Id，以及对应的<程序中版本，文件中版本>
        /// \return bool 完成返回true;如果遇到任何失败false
        static bool CompareClassSchemasInFilesWithApp(
            const std::wstring& fileFullPath,
            std::set<Guid>* added = nullptr,
            std::set<Guid>* deleted = nullptr,
            std::map<Guid, std::pair<uint32_t, uint32_t>>* updated = nullptr
        );

        /// \brief 计算当前App的ClassSchema的MD5值
        ///
        /// 这里会对App中的ClassSchema按照ClassId进行一个排序，以保证App中ClassSchema在没有发生改变时，每次计算的MD5值相同
        /// \param classSchemasMd5 计算出的MD5值
        /// \param isDumpClassSchemaBinaryData  是否将ClassSchema的二进制数据dump到文件中(位置放在对应Logs文件下)；true：dump；false:不dump
        /// \return bool true:成功；false：失败
        static bool ComputerClassSchemasMd5(std::wstring& classSchemasMd5,bool isDumpClassSchemaBinaryData);
    };

}
